Векторный DSL

Надо как-то назвать язык. Назову его О. Задачи языка:

— Предоставлять конфигурирование системы: выделение кольцевых буферов, аллокация компилированных файлов в виде зада для планировщика, создание таймеров, посылание сообщений между корами по скоростной шине, конфигурация это шины.

— Выступать в роли векторного DSL для K Cell. Каждая K Cell — это по сути вектор или растовский итератор, поддерживающий все его интерфейсы и поддающийся векторизации. Есть также библиотеки распаралеливания этих итераторов.

Сейчас язык парсает основные диалекты K, Q, oK.js, а также Kona. В К мире не приянято писать декларативные парсеры, так как строятся ручные интерпетаторы с встроеным токенайзером. Но поскольку мы воспринимам К программу как DSL к итераторам, нам нужно все AST сразу для ленивого выполнения, поэтому так или иначе строить его нужно. Ну и еще листы в векторы сворачивать, все это тоже можно эффективно делать на этапе парсинга.

Покажу на примере, например нам нужно вычислить скалярное произведение двух векторов:

+/{x*y}[(1;3;4;5;6);(2;6;2;1;3)]

А теперь представим вместо очередей Ioverb устройства, индексы кольцевых буферов в стиле как мы идектируем потоки ввода выводы (0: и 1:) — "1212:" или "3600:".

+/{x*y}[1212:;3600:]

Это транформируется в растовский:

vec1.iter() .zip(vec2.iter()) .map(|(i, j)| i * j) .sum()

И в итоге векторизируется LLVM в:

.LBB0_7: testq %r8, %r8 je .LBB0_9 movdqu 16(%rdx,%rax,4), %xmm2 movdqu 16(%rdi,%rax,4), %xmm3 pshufd $245, %xmm2, %xmm4 pmuludq %xmm3, %xmm2 pshufd $232, %xmm2, %xmm2 pshufd $245, %xmm3, %xmm3 pmuludq %xmm4, %xmm3 pshufd $232, %xmm3, %xmm3 punpckldq %xmm3, %xmm2 paddd %xmm2, %xmm1 movdqu (%rdx,%rax,4), %xmm2 movdqu (%rdi,%rax,4), %xmm3 pshufd $245, %xmm2, %xmm4 pmuludq %xmm3, %xmm2 pshufd $232, %xmm2, %xmm2 pshufd $245, %xmm3, %xmm3 pmuludq %xmm4, %xmm3 pshufd $232, %xmm3, %xmm3 punpckldq %xmm3, %xmm2 paddd %xmm2, %xmm0